/**
 * @file Etudiant.h
 * @brief Fichier d'entête du module Etu.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Saleh
 */
#ifndef _ETUDIANT_H
#define _ETUDIANT_H


/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de Etu                                */
/*                                                                       */
/* ********************************************************************* */

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "UtilStr.h"

#include "Chemin.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Définitions de types                           */
/*                                                                       */
/* ********************************************************************* */

/**
 * @struct Etu
 * @brief Structure utilisée pour la gestion d'une Etu.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sEtudiant
	{
	    int numEtu;
		char * nomEtu;
		char *prenomEtu;
	};

/**
 * @typedef Etu
 * @brief Redéfinit la structure sEtu
 */
typedef struct sEtudiant Etu ;


/**
 * @struct sTabEtudiant
 * @brief Structure utilisée pour la gestion d'une Etu.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct  sTabEtudiant
{
  Etu**tabEtu;
  int nbEtu;
};

/**
 * @typedef TabEtu
 * @brief Redéfinit la structure sTabEtudiant
 */
typedef struct  sTabEtudiant    TabEtu;

/**
 * @fn void initEtu(Etu * Etu,const int numEtu,const char * nomEtu,const char * prenomEtu);
 * @brief Initialise un Etu.
   initEtu initialise numEtu, nomEtu et prenomEtu (après vérification) de la structure Etu

 * @param[in, out] etu Pointeur vers l'etu à initialiser.
 * @param[in] numEtu Code de l'Etu.
 * @param[in] nomEtu nomEtu de l'Etu.
 * @param[in] prenomEtu prenomEtu de l'Etu.
 * @return 0 si tout est OK
 */
void initEtu(Etu * etudiant, const int numEtu,const char * nomEtu,const char * prenom);

/**
 * @fn Etu * creEtu(const int numEtu,const char * nomEtu,const char * prenomEtu);
 * @brief Crée un Etu en mémoire.

 * @param[in] numEtu Code de l'Etu.
 * @param[in] nomEtu Hauteur de l'Etu.
 * @param[in] prenomEtu prenomEtu de l'Etu.
 * @return un pointeur vers un Etu
 */
Etu *creEtu(const int numEtu, const char *nomEtu, const char *prenomEtu);

/**
 * @fn void libEtu(Etu * etu);
 * @brief Libere un Etu en mémoire.

 * @param[in, out] etu Pointeur vers l'etu.
 * @return 0 si tout est OK
 */
void libEtu(Etu *etudiant);

/**
 * @fn detruireEtu(Etu ** etu);
 * @brief Détruit un Etu en mémoire.

 * @param[in, out] etu Pointeur vers l'etu.
 * @return 0 si tout est OK
 */
void detEtu(Etu ** etudiant);

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure Etu                */
/*																		*/
/* ******************************************************************** */

/**
 * @fn int getNumEtu(const Etu * etu);
 * @brief returner numEtu.

 * @param[in] etu pointeur vers l'etu.
 * @return numEtu
 */
int getNumEtu(const Etu *etudiant);

/**
 * @fn void setnumEtu(Etu * etu, int numEtu);
 * @brief modifie le champ numEtu de l'etu.

 * @param[in, out] etu Pointeur vers l'etu.
 * @param[in] numEtu Code de l'Etu.
 * @return 0 si tout est OK
 */
void setNumEtu(Etu *etudiant,const int numEtu);

/**
 * @fn char * getNomEtu(const Etu * etu);
 * @brief returner nomEtu.

 * @param[in] etu pointeur vers l'etu.
 * @return nomEtu.
 */

char * getNomEtu(const Etu *etudiant);

/**
 * @fn void setNomEtu(Etu * etu,const char * nomEtu);
 * @brief modifie le champ nomEtu de l'etu.

 * @param[in, out] etu Pointeur vers l'etu.
 * @param[in] nomEtu nomEtu de l'Etu.
 * @return 0 si tout est OK.
 */
void setNomEtu(Etu *etudiant,const char *nomEtu);

/**
 * @fn char * getPrenomEtu(const Etu * etu);
 * @brief returner nomEtu.

 * @param[in] etu pointeur vers l'etu.
 * @return nomEtu.
 */
char * getPrenomEtu(const Etu *etudiant);

/**
 * @fn void setPrenomEtu(Etu * etu, const char *prenomEtu);
 * @brief modifie le champ nomEtu de l'etu.

 * @param[in, out] etu Pointeur vers l'etu.
 * @param[in] nomEtu nomEtu de l'Etu.
 * @return 0 si tout est OK.
 */
void setPrenomEtu(Etu *etudiant,const char *prenomEtu);

/**
 * @fn void affEtu(const Etu * etu);
 * @brief Afficher l'etu.

 * @param[in] etu pointeur vers l'etu.
 * @return 0 si tout est OK
 */
void affEtu(const Etu *etudiant);

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Etu                       */
/*                                                                       */
/* ********************************************************************* */

/**
 * @fn void savEtuParElem(const int numEtu,const char * nomEtu,const char * prenomEtu);
 * @brief saover Etu dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] nomEtu .
 * @param[in] prenomEtu .

 * @return 0 si tout est OK.
 */
void savEtuParElem(const int numEtu,const char * nomEtu,const char * prenomEtu);


/**
 * @fn void savEtuParElem(const int numEtu,const char * nomEtu,const char * prenomEtu);
 * @brief saover Etu dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] nomEtu .
 * @param[in] prenomEtu .

 * @return 0 si tout est OK.
 */
void savEtu(Etu*etu);



/**
 * @fn int rchEtuParCode(const int codeEtu);
 * @brief recherche Etu dans un fichier binaire.
 *
 * @param[in] numEtu .

 * @return 0 s'il n'existe pas.
 * @return 1 s'il existe.
 */
int rchEtuParCode(const int numEtu);

/**
 * @fn Etu *recEtuParCode(const int codeEtu);
 * @brief recupérer Etu dans un fichier binaire.
 *
 * @param[in] numEtu .

 * @return Etu s'il n'existe pas.
 * @return NULL s'il existe.
*/
Etu *recEtuParCode(const int numEtu);

/**
 * @fn int supEtuParCode(const int codeEtu);
 * @brief supprimer Etu dans un fichier binaire.
 *
 * @param[in] numEtu .

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supEtuParCode(const int numEtu);

/**
 * @fn int supEtu(Etu*etu);
 * @brief supprimer Etu dans un fichier binaire.
 *
 * @param[in] etu .

 * @return -1 s'il n'existe pas.
 * @return 0 s'il supprime.
 */
int supEtu(Etu*etu);

/**
 * @fn int modifEtu(Etu*etu,Etu*etunew);
 * @brief modifier Etu dans un fichier binaire.
 *
 * @param[in] etu.
 * @param[in] newetu.

 * @return -1 s'il n'existe pas.
 * @return 1 s'il modifie.
 * @return 0 si non.
 */
int modifEtu(Etu*etu,Etu*etunew);

/**
 * @fn mdfEtuParCode(const int codeEtu, const Etu *nEtu);
 * @brief modifier Etu dans un fichier binaire.
 *
 * @param[in] numEtu .
 * @param[in] Etu .

 * @return -1 s'il n'existe pas.
 * @return 1 s'il modifie.
 * @return 0 si non.
 */
int mdfEtuParCode(const int numEtu, Etu *pEtu);

/**
 * @fn affEtu_DB();
 * @brief Afficher base de donnee de Etu .


 * @return 0 si tout est OK.
 */
void affEtu_DB();

/**
 * @fn void regEtu() ;
 * @brief Test le module Etu
 */
void regEtu();

#endif
